﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using WaterRegimenMonitor.Web.Domain;

namespace WaterRegimenMonitor.Web.Code
{
    /// <summary>
    /// HTML错误捕获特性，用于捕获HTML错误。
    /// </summary>
    public class HtmlHandleErrorAttribute : HandleErrorAttribute
    {
        /// <summary>
        /// 当发生异常时调用。
        /// </summary>
        /// <param name="exceptionContext">异常内容。</param>
        public override void OnException(ExceptionContext exceptionContext)
        {
            //判断是否发生异常。
            if (exceptionContext.Exception != null)
            {
                //用于保存内容结果。
                ContentResult content = new ContentResult();

                //用于保存错误信息
                string errorHtml = null;

                //判断是否为未认证异常
                if (exceptionContext.Exception is UnauthenticatedException)
                {
                    errorHtml = "您还没有登录，请登录!";
                    exceptionContext.HttpContext.Response.StatusCode = (int)HttpErrorCode.Unauthenticated;
                }
                //判断是否为未授权异常
                else if (exceptionContext.Exception is UnauthorizedException)
                {
                    errorHtml = "您没有获得授权，浏览此信息!";
                    exceptionContext.HttpContext.Response.StatusCode = (int)HttpErrorCode.Unauthorized;
                }
                //判断是否为常规异常
                else if (exceptionContext.Exception is CommonException)
                {
                    errorHtml = exceptionContext.Exception.Message;
                    exceptionContext.HttpContext.Response.StatusCode = (int)HttpErrorCode.CommonError;
                }
                //其它异常
                else
                {
                    errorHtml = "对不起，系统出错了，请稍后再试！";
                    exceptionContext.HttpContext.Response.StatusCode = (int)HttpErrorCode.CommonError;
                }
#if DEBUG
                //如果是调试模式，则显示完整的异常信息
                errorHtml = exceptionContext.Exception.ToString();
#endif
                //设置返回内容
                content.Content = errorHtml;
                //忽略IIS异常
                exceptionContext.HttpContext.Response.TrySkipIisCustomErrors = true;
                //设置结果
                exceptionContext.Result = content;
                //设置异常已经被捕获
                exceptionContext.ExceptionHandled = true;
            }
        }
    }
}
